package com.example.springboot_sdse_air.service;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.springboot_sdse_air.entity.Pdf;
import com.example.springboot_sdse_air.mapper.PdfMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.io.File;
import java.sql.Timestamp;
import java.util.List;

/**
 * 功能：
 * 作者：王彬 202200111149
 * 日期：2025-04-21 16:04
 */
@Service
public class PdfService extends ServiceImpl<PdfMapper, Pdf> {

    @Resource
    PdfMapper pdfMapper;

    private static final String ROOT_PATH = System.getProperty("user.dir") + File.separator + "files";

    @Override
    public boolean save(Pdf pdf) {
        Pdf completePdf = complete(pdf);
        return super.save(completePdf);
    }

    public Pdf complete(Pdf pdf) {
        if (StrUtil.isEmptyIfStr(pdf.getUploadTime())) {
            pdf.setUploadTime(new Timestamp(System.currentTimeMillis()));
        }
        return pdf;
    }

    /**
     * 删除PDF文件（包括物理文件）
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean deleteById(Integer id) {
        // 先查询文件信息
        Pdf pdf = this.getById(id);
        if (pdf == null) {
            return false;
        }
        
        // 删除物理文件
        deletePhysicalFile(pdf);
        
        // 删除数据库记录
        return this.removeById(id);
    }

    /**
     * 批量删除PDF文件（包括物理文件）
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean batchDelete(List<Integer> ids) {
        if (ids == null || ids.isEmpty()) {
            return false;
        }
        
        // 查询所有要删除的文件信息
        List<Pdf> pdfs = this.listByIds(ids);
        
        // 删除物理文件
        for (Pdf pdf : pdfs) {
            deletePhysicalFile(pdf);
        }
        
        // 删除数据库记录
        return this.removeByIds(ids);
    }

    /**
     * 删除物理文件
     */
    private void deletePhysicalFile(Pdf pdf) {
        try {
            // 删除PDF文件
            if (StrUtil.isNotBlank(pdf.getParentFolderName()) && StrUtil.isNotBlank(pdf.getName())) {
                String pdfPath = ROOT_PATH + File.separator + "UserPdf" + File.separator 
                               + pdf.getParentFolderName() + File.separator + pdf.getName();
                File pdfFile = new File(pdfPath);
                if (pdfFile.exists()) {
                    pdfFile.delete();
                }
                
                // 删除解析结果文件夹
                String fileNameWithoutExt = pdf.getName().replaceAll("\\.pdf$", "");
                String resultPath = ROOT_PATH + File.separator + "UserPdf" + File.separator 
                                  + pdf.getParentFolderName() + File.separator + fileNameWithoutExt;
                File resultFolder = new File(resultPath);
                if (resultFolder.exists() && resultFolder.isDirectory()) {
                    deleteDirectory(resultFolder);
                }
                
                // 删除父文件夹（如果为空）
                File parentFolder = new File(ROOT_PATH + File.separator + "UserPdf" + File.separator + pdf.getParentFolderName());
                if (parentFolder.exists() && parentFolder.isDirectory() && parentFolder.list().length == 0) {
                    parentFolder.delete();
                }
            }
        } catch (Exception e) {
            // 删除文件失败不影响主流程，只记录日志
            System.err.println("删除物理文件失败: " + e.getMessage());
        }
    }

    /**
     * 递归删除目录
     */
    private void deleteDirectory(File directory) {
        if (directory.exists()) {
            File[] files = directory.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        deleteDirectory(file);
                    } else {
                        file.delete();
                    }
                }
            }
            directory.delete();
        }
    }
}
